/** 通用可记录类型（替代 Record<string, any>） */
export type Recordable<T = any> = Record<string, T>;

/** 表达式执行上下文类型（明确可访问的变量和工具函数） */
export interface ExprContext<T = Recordable> {
  row: T; // 表格行数据
  index: number; // 行索引
  $root?: Recordable; // 可选：全局上下文（如 Pinia/Vuex 状态）
  /** 安全获取对象属性（避免嵌套报错） */
  _get: <R = any>(obj: Recordable, path: string, defaultValue?: R) => R;
  /** 逻辑异或（true ^ true = false, true ^ false = true） */
  _xor: (a: boolean, b: boolean) => boolean;
}

/** 表格操作按钮配置类型 */
export interface TableOperationButton<T = Recordable> {
  label: string; // 按钮文本
  icon?: string; // 图标（Element Plus 图标名）
  type?: 'primary' | 'success' | 'warning' | 'danger' | 'info' | 'text'; // 按钮类型
  visibleExpr?: string; // 可见性表达式
  onClick: (row: T, index: number) => void; // 点击事件
  [key: string]: any; // 扩展字段（如权限、禁用状态等）
}

/** 表格列配置类型 */
export interface TableColumn<T = Recordable> {
  label: string; // 列标题
  prop: string; // 字段名（唯一标识）
  type?: 'normal' | 'operation'; // 列类型（普通列/操作列）
  formatter?: (row: T) => string | number | boolean; // 单元格格式化函数
  buttons?: TableOperationButton<T>[]; // 操作列按钮（仅 type=operation 有效）
  [key: string]: any; // 扩展字段
}